package com.dog.basics.common.util;

import cn.hutool.core.collection.CollUtil;
import io.swagger.annotations.ApiModelProperty;
import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GlobalCoordinates;

import java.math.BigDecimal;
import java.util.List;

/**
 * @author He
 * @功能描述: 经度纬度计算距离
 * @date 2021/1/12
 */
public class PositionUtil {

    /**
     * 计算经纬度距离
     *
     * @param latitudeFrom  纬度.1
     * @param longitudeFrom 经度.1
     * @param latitudeTo    纬度.2
     * @param longitudeTo   经度.2
     * @return guonh 2021年1月25日
     */
    public static double getDistance(double latitudeFrom, double longitudeFrom, double latitudeTo, double longitudeTo) {
        GlobalCoordinates source = new GlobalCoordinates(latitudeFrom, longitudeFrom);
        GlobalCoordinates target = new GlobalCoordinates(latitudeTo, longitudeTo);
        return new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.Sphere, source, target).getEllipsoidalDistance();
    }

    /**
     * 计算一个点的圆的外界正方形
     * @param longitude
     * @param latitude
     * @param distance
     * @return
     *
     *MYSQL : (st_distance(point(lng,lat),point(#{dto.userLng},#{dto.userLat}))) AS dis  距离实例
     *
     *  AND lat &gt; #{dto.minlat} AND lat  &lt; #{dto.maxlat}
     *  AND lng &gt; #{dto.minlng} AND lng  &lt; #{dto.maxlng}
     */

    /**
     * 最小纬度
     */
    //@ApiModelProperty(hidden = true)
    //private BigDecimal minlat;
    /**
     * 最大纬度
     */
    //@ApiModelProperty(hidden = true)
    //private BigDecimal maxlat;

    /**
     * 最小经度
     */
    //@ApiModelProperty(hidden = true)
    //private BigDecimal minlng;

    /**
     * 最小经度
     */
    //@ApiModelProperty(hidden = true)
    //private BigDecimal maxlng;
    public static List<Double> findNeighPosition(double longitude, double latitude, double distance) {
        //先计算查询点的经纬度范围
        //地球半径千米
        double r = 6371;
        //距离
        double dis = distance;
        double dlng = 2 * Math.asin(Math.sin(dis / (2 * r)) / Math.cos(latitude * Math.PI / 180));
        //角度转为弧度
        dlng = dlng * 180 / Math.PI;
        double dlat = dis / r;
        dlat = dlat * 180 / Math.PI;
        double minlat = latitude - dlat;
        double maxlat = latitude + dlat;
        double minlng = longitude - dlng;
        double maxlng = longitude + dlng;

        return CollUtil.newArrayList(minlat, maxlat, minlng, maxlng);

    }
}
